#include "chatserver.hpp"
#include "chatservice.hpp"
#include "json.hpp"
#include <iostream>
#include<functional>
#include<string>
using namespace std;
using namespace placeholders;
using json = nlohmann::json;
/*
#include<functional>
using namespace placeholders
*/
// loop为时间板，listenAddr为监听端口，nameArg为服务名
ChatServer::ChatServer(EventLoop *loop, const InetAddress &listenAddr, const string &nameArg)
    : _server({loop, listenAddr, nameArg}), _loop(loop)
{
    // 处理用户连接的回调
    _server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));
    // 处理用户的消息的回调
    // 连接，缓冲区，接收到数据的事件信息
    _server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));
    // 设置服务端线程数量，muduo库会自动划分io线程和work线程
    _server.setThreadNum(4);
}

void ChatServer::onConnection(const TcpConnectionPtr &conn)
{
    cout<<"进入连接和断开处理"<<endl;
    // 客户端断开链接
    if (!conn->connected())
    {
        cout<<"该连接已断开"<<endl;
        ChatService::instance()->clientCloseException(conn);
        conn->shutdown();
    }
}
void ChatServer::onMessage(const TcpConnectionPtr &conn, Buffer *buffer, Timestamp time)
{
    string buf = buffer->retrieveAllAsString();
    // 如果传过来的消息为空，什么也不做
    // 接收到消息后，对其进行反序列化为json数据
    json js = json::parse(buf);
    // 获取service的示例和Message对应事件的事件处理器
    auto msgHandler = ChatService::instance()->getHandler(js["msgid"].get<int>());
    // 回调消息对应的事件处理器，来执行对应的业务处理。
    msgHandler(conn, js, time);
}

// 开启事件循环
void ChatServer::start()
{
    _server.start();
}
